<?php
/**
 * Nweb Framework
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @category    source
 * @package     pl.nweb.framework.ftp
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @license     http://www.gnu.org/licenses/lgpl-3.0.txt  GNU Lesser General Public
 * @version     3.0 $Id$
 * @link        http://code.google.com/p/nweb-framework/
 * @link        http://framework.nweb.pl
 */

namespace pl\nweb\framework\ftp;

/**
 * Element na serwerze FTP
 *
 * @category    source
 * @package     pl.nweb.framework.ftp
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @version     3.0 $Id$
 */
abstract class Element
{
    /**
     * Ścieżka
     *
     * @var string
     */
    protected $_path = null;

    /**
     * Nazwa elementu
     *
     * @var string
     */
    protected $_name = null;

    /**
     * Klient FTP
     *
     * @var Client
     */
    protected $_client = null;

    /**
     * Typy elementów
     */
    const TYPE_FILE      = 1;
    const TYPE_DIRECTORY = 2;

    /**
     * Konstruktor
     *
     * @param Application_Service_Ftp $server obiekt serwera
     * @param string $path pełna ścieżka elementu
     */
    public function __construct(Application_Service_Ftp $server, $path)
    {
        $this->_client = $server;
        $this->_path   = $path;
    }

    /**
     * Zwraca połączenie z serwerem
     *
     * @return Client
     */
    public function getClient()
    {
        return $this->_client;
    }

    /**
     * Zmienia uprawnienia elementowi
     *
     * @param int $permissions uprawnienia ósemkowo (np. 0777)
     * @return boolean
     */
    public function chmod($permissions)
    {
        return $this->getClient()->chmod($this->getPath(), $permissions);
    }

    /**
     * Zwraca nazwę elementu
     *
     * @return string
     */
    public function getName()
    {
        if(null === $this->_name) {
            $this->_name = basename($this->_path);
        }
        return $this->_name;
    }

    /**
     * Zwraca pełną ścieżkę elementu
     *
     * @return string
     */
    public function getPath()
    {
        return $this->_path;
    }

    /**
     * Zwraca flagę czy element jest katalogiem
     *
     * @return boolean
     */
    public function isDirectory()
    {
        return $this instanceof Directory;
    }

    /**
     * Zwraca flagę czy element jest plikiem
     *
     * @return boolean
     */
    public function isFile()
    {
        return $this instanceof File;
    }

    /**
     * Zmienia nazwę elementu
     *
     * @param string $newname nowa nazwa katalogu
     * @return boolean
     * @throws Exception
     */
    abstract public function rename($newname);

    /**
     * Usuwa element
     *
     * @return boolean
     * @throws Exception
     */
    abstract public function delete();
}